# -*- encoding: utf-8 -*-
#!/usr/bin/env python

import pygame, sys
from pygame.locals import *
from pygame import font, sprite, time
import pygame.mixer
from random import randint

largura = 1024
altura = 700
pygame.init()
pygame.display.set_caption("Pouse se Puder!")
tela = pygame.display.set_mode((largura, altura))

class Aviao():
    def __init__(self):
        self.velocidade = 2
        self.direcao = 1
        self.imagem = pygame.image.load('Aviao.png')
        self.rect = self.imagem.get_rect()#Pega self.imagem (variável que armazena a imagem) e transforma em um 'retangulo', para assim poder usar o collide
        self.rect.y = 60
        self.rect.x = -150
        self.som = pygame.mixer.Sound("aviao_som.wav")
        self.som.play(-1)
           
    def mover(self, nivel = 0):
        self.rect.move_ip((self.direcao*(self.velocidade + nivel),0))
        if self.rect.left < - 200:#Movimenta o objeto para a esquerda, girando o objeto em torno do eito X
            self.direcao = 1
            self.imagem = pygame.transform.flip(self.imagem, self.rect.x, False)
            
        elif self.rect.right > largura + 200:#Movimenta o objeto para a direita, girando objeto em torno do eito X
            self.direcao = -1
            self.imagem = pygame.transform.flip(self.imagem, self.rect.x, False)
            
        tela.blit(self.imagem, self.rect)

class Paraquedista(pygame.sprite.Sprite):
    def __init__(self, velocidade):
        pygame.sprite.Sprite.__init__(self)
        self.salto = False
        self.velocidade = velocidade
        self.imagem = pygame.image.load('boneco.png')
        self.rect = self.imagem.get_rect()#Pega self.imagem (variável que armazena a imagem) e transforma em um 'retangulo', para assim poder usar o collide
       
    def saltar(self):
        self.rect = self.rect.move(self.velocidade)
        tela.blit(self.imagem, self.rect)

        if self.rect.left < 0: #Isso não permitirá o paraq. ultrapassar a tela.
            self.rect.left = 1
        elif self.rect.right > largura:#Isso não permitirá o paraq. ultrapassar a tela.
            self.rect.right = largura     


class Bote(pygame.sprite.Sprite):
    def __init__(self, velocidade, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.velocidade = velocidade
        self.direcao = 1
        self.imagem = pygame.image.load('bote.png')
        self.rect = self.imagem.get_rect()#Pega self.imagem (variável que armazena a imagem) e transforma em um 'retangulo', para assim poder usar o collide
        self.rect.x = x
        self.rect.y = y
        self.rect.size = (50,150) # Este atributo serve para ajustar o tamanho do retângulo
               
    def mover(self):
        self.rect.move_ip((self.direcao*self.velocidade,0))
        if self.rect.x < largura + 200:#Movimenta o objeto no eixo X
            self.direcao = 1          
        else:#Faz o objeto retorna a posição do eito X
            self.rect.x = -100     
        tela.blit(self.imagem, self.rect)
        
  
class Bala(pygame.sprite.Sprite):
    def __init__(self, velocidade):
        pygame.sprite.Sprite.__init__(self)
        self.velocidade = velocidade
        self.direcao = 1
        self.imagem = pygame.image.load('bala.png')
        self.rect = self.imagem.get_rect()#Pega self.imagem (variável que armazena a imagem) e transforma em um 'retangulo', para assim poder usar o collide
        self.rect.x = -50
        self.rect.y = randint(200,510)#valores aleatórios para a o eixo Y
        self.som = pygame.mixer.Sound("boom.wav")
        self.som.play()
                
    def mover(self):
        self.rect.move_ip((self.direcao*self.velocidade,0))
        if self.rect.left < - 50:#Movimenta o objeto para a esquerda, girando o objeto em torno do eito X
            self.som.play()
            self.direcao = 1
            self.rect.y = randint(200,510)
            self.imagem = pygame.transform.flip(self.imagem, self.rect.x, False)
        elif self.rect.right > largura + 50:#Movimenta o objeto para a direita, girando o objeto a bala em torno do eito X
            self.som.play()
            self.direcao = -1
            self.rect.y = randint(200,510)
            self.imagem = pygame.transform.flip(self.imagem, self.rect.x, False)
        tela.blit(self.imagem, self.rect)


       
class Jogador(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.vidas = 3
        
    def perder(self):
        #Mostra uma mensagem de fim de jogo
        self.imagem = u"Fim de Jogo!"
        fim = _font.render(self.imagem,1,(255,0,0))
        tela.fill((0,0,0))
        tela.blit(fim, (300,300))
        pygame.time.wait(500)
         
class Nivel():
    def __init__(self, nivel):
        self.nivel = nivel
       
    def mudarNivel(self):
        #Altera os valores dos objetos de acordo com o nível
        self.nivel += 1
        b1.velocidade += 0.5
        bala1.velocidade += 0.5
        bala2.velocidade += 0.5
        bala3.velocidade += 0.5
        return self.nivel
       
    def mostrarNivel(self):
        #Mostra o nível de j1
        self.imagem = u"%d" %self.nivel
        nivel = _font.render(self.imagem,1,(255,255,255))
        tela.blit(nivel, (130,2))
       
    def mostrarSaudacao(self):
        #Mostra uma saudação quando passa de nível
        self.imagem = pygame.image.load("prox.png")
        tela.blit(self.imagem, (105,250))
        pygame.time.delay(500)
       
    def mostrarVidas(self):
        #Mostra a quantidade de vida de j1
        self.imagem = u"%d" %j1.vidas
        vidas = _font.render(self.imagem,1,(255,255,255))
        tela.blit(vidas, (390,2))
        
class Musica():
    def __init__(self):
        self.arquivo = pygame.mixer.music.load("scramble.ogg")
        
    def tocar(self):
        return pygame.mixer.music.play()


p1 = Paraquedista([0,1])#Instância da classe Paraquedista, sendo passado para o construtor a velocidade que o objeto vai se movimentar nos eixos X e Y
b1 = Bote(2, -200, altura - 60)#Instância da Classe Bote, sendo passado para o construtor velocidade e a posição do objeto nos eixos X e Y
a1 = Aviao()#Instância da classe Aviao
j1 = Jogador()#Instância da classe Jogador
n1 = Nivel(1)#Instância da classe Nivel, sendo passado para o construtor o nível
bala1 = Bala(2)#Instância da classe Bala, sendo passado para o construtor a velocidade bala
bala2 = Bala(2)#Instância da classe Bala, sendo passado para o construtor a velocidade bala
bala3 = Bala(2)#Instância da classe Bala, sendo passado para o construtor a velocidade bala
m1 = Musica()


fundo = pygame.image.load('ceu.jpg')
pygame.display.flip()
_font = font.SysFont('Arial', 40)
pygame.key.set_repeat(45)
verificador = True
m1.tocar()

verificador = True #Variável para o controle do objeto p1

while j1.vidas > 0:   

    #if verifica se p1, no eixo y, tocou o final da tela, sem colidir com b1

    if (p1.rect.y == altura - 50) and not pygame.sprite.collide_rect(p1, b1):
        j1.vidas -= 1#Diminui uma vida
        del(p1)#Apaga o objeto p1
        p1 = Paraquedista([0,1])#Instância da classe Paraquedista, sendo passado para o construtor a velocidade que o objeto vai se movimentar nos eixos X e Y
        verificador = True
   
    tela.blit(fundo, (0,0))
    b1.mover()
    a1.mover()
    n1.mostrarNivel()
    n1.mostrarVidas()
    
    if n1.nivel == 1:#Verificando os níveis e adicionado as balas
        bala1.mover()
    elif n1.nivel == 2:#Verificando os níveis e adicionado as balas
        bala1.mover()
        bala2.mover()
    elif n1.nivel >= 3:#Verificando os níveis e adicionado as balas
        bala1.mover()
        bala2.mover()
        bala3.mover()

    if p1.salto == True:#Verificando o atributo salto do objeto p1
        p1.saltar()     

    if j1.vidas == 0:#Verificando o atributo vida do objeto j1
        j1.perder()

    if pygame.sprite.collide_rect(b1, p1):#Verificando se b1(bote) e p1(paraquedista) colidiram
        n1.mostrarSaudacao()#Mostrando saudação
        n1.mudarNivel()#Mudando o nível
        del(p1)#Apaga o objeto p1
        p1 = Paraquedista([0,1])#Instância da classe Paraquedista, sendo passado para o construtor a velocidade que o objeto vai se movimentar nos eixos X e Y
        verificador = True
    #Verificando se p1 colidiu com bala1 ou bala2 ou bala3
    if pygame.sprite.collide_rect(p1, bala1):
        j1.vidas -= 1
        del(p1)
        p1 = Paraquedista([0,1])
        verificador = True
    if pygame.sprite.collide_rect(p1, bala2):
        j1.vidas -= 1
        del(p1)
        p1 = Paraquedista([0,1])
        verificador = True
    if pygame.sprite.collide_rect(p1, bala3):
        j1.vidas -= 1
        del(p1)
        p1 = Paraquedista([0,1])
        verificador = True
       
    pygame.display.flip()    
     
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and verificador:#Verifica se ESPAÇO foi apertado e se verificador é VERDADEIRO
                p1.rect.x = a1.rect.x + 50#Imprime p1 no eixo X
                p1.rect.y = a1.rect.y + 20#Imprime p1 no eixo Y
                p1.salto = True#Muda o valor do atributo salto de p1
                verificador = False#Muda o valor de verificador, assim impedindo que p1 seja impresso novamente até que o valor mude para VERDADEIRO
            elif event.key == pygame.K_LEFT:#Verifica a tecla seta para a esquerda
                p1.rect.left -= 5#Muda o valor do atributo, assim movimentando p1
            elif event.key == pygame.K_RIGHT:#Verifica a tecla seta para a direita
                p1.rect.right += 5#Muda o valor do atributo, assim movimentando p1